package com.telrob.bytevm.instruct;

import java.util.List;

import com.telrob.bytevm.compile.Instruct;
import com.telrob.bytevm.compile.ReplaceCode;
import com.telrob.bytevm.utils.Define;
import com.telrob.bytevm.utils.ToolUtils;
import com.telrob.bytevm.vm.Register;
/***
 * mov指令
 * @author wh
 *
 */
public class MOV implements Instruct{
	public boolean isPseudo(String opt) {
		return false;
	}
	@Override
	public boolean isComplie(String opt) {
		if(opt.toLowerCase().startsWith("mov")) {
			return true;
		}
		return false;
	}

	@Override
	public byte[] complie(String line,String[] param,int curretIndex,List<ReplaceCode>labelReplace) {
		byte[]data=null;
		if("movrn".equals(param[0].toLowerCase())) {
			//数据直接传送到寄存器中
			data=new byte[6];
			data[0]=Define.MOVRN;
			String o2=param[1].toLowerCase();
			if("ax".equals(o2)) {
				data[1]=Define.AX;
			}else if("bx".equals(o2)) {
				data[1]=Define.BX;
			}else if("cx".equals(o2)) {
				data[1]=Define.CX;
			}else if("dx".equals(o2)) {
				data[1]=Define.DX;
			}else if("ex".equals(o2)) {
				data[1]=Define.EX;
			}else if("ss".equals(o2)) {
				data[1]=Define.SS;
			}else if("si".equals(o2)) {
				data[1]=Define.SI;
			}else if("sp".equals(o2)) {
				data[1]=Define.SP;
			}else if("bp".equals(o2)) {
				data[1]=Define.BP;
			}else if("di".equals(o2)) {
				data[1]=Define.DI;
			}
			int number=0;
			try {
				//当不是数字时候就当标签来处理
				number=ToolUtils.parseNum(param[2]);
			}catch(Exception e) {
				ReplaceCode code=new ReplaceCode(param[2], curretIndex+2);
				labelReplace.add(code);
			}
			data[2]=(byte)(0xFF&(number>>0));
			data[3]=(byte)(0xFF&(number>>8));
			data[4]=(byte)(0xFF&(number>>16));
			data[5]=(byte)(0xFF&(number>>24));
		}else if("movrr".equals(param[0].toLowerCase())) {
			//两个寄存器间的相互操作
			data=new byte[3];
			data[0]=Define.MOVRR;
			String o2=param[1].toLowerCase();
			if("ax".equals(o2)) {
				data[1]=Define.AX;
			}else if("bx".equals(o2)) {
				data[1]=Define.BX;
			}else if("cx".equals(o2)) {
				data[1]=Define.CX;
			}else if("dx".equals(o2)) {
				data[1]=Define.DX;
			}else if("ex".equals(o2)) {
				data[1]=Define.EX;
			}else if("ss".equals(o2)) {
				data[1]=Define.SS;
			}else if("si".equals(o2)) {
				data[1]=Define.SI;
			}else if("sp".equals(o2)) {
				data[1]=Define.SP;
			}else if("bp".equals(o2)) {
				data[1]=Define.BP;
			}else if("di".equals(o2)) {
				data[1]=Define.DI;
			}
			String o3=param[2].toLowerCase();
			if("ax".equals(o3)) {
				data[2]=Define.AX;
			}else if("bx".equals(o3)) {
				data[2]=Define.BX;
			}else if("cx".equals(o3)) {
				data[2]=Define.CX;
			}else if("dx".equals(o3)) {
				data[2]=Define.DX;
			}else if("ex".equals(o3)) {
				data[2]=Define.EX;
			}else if("ss".equals(o3)) {
				data[2]=Define.SS;
			}else if("si".equals(o3)) {
				data[2]=Define.SI;
			}else if("sp".equals(o3)) {
				data[2]=Define.SP;
			}else if("bp".equals(o3)) {
				data[2]=Define.BP;
			}else if("di".equals(o3)) {
				data[2]=Define.DI;
			}
		}
		return data;
	}

	public int isRun(byte opt) {
		if(opt==Define.MOVRN) {
			return 6;
		}else if(opt==Define.MOVRR) {
			return 3;
		}
		return -1;
	}
	public void parseRun(Register R,byte opt,byte[]data) {
		if(opt==Define.MOVRN) {
			byte rx=data[R.PC+1];
			int dd=ToolUtils.getInt(data, R.PC+2);
			if(rx==Define.AX) {
				R.AX=dd;
			}else if(rx==Define.BX) {
				R.BX=dd;
			}else if(rx==Define.CX) {
				R.CX=dd;
			}else if(rx==Define.DX) {
				R.DX=dd;
			}else if(rx==Define.EX) {
				R.EX=dd;
			}else if(rx==Define.BP) {
				R.BP=dd;
			}else if(rx==Define.SS) {
				R.SS=dd;
			}else if(rx==Define.SP) {
				R.SP=dd;
			}
			//程序计数器下移
			R.PC+=isRun(opt);
		}else if(opt==Define.MOVRR) {
			byte rx2=data[R.PC+2];
			byte rx=data[R.PC+1];
			int number=0;
			if(rx2==Define.AX) {
				number=R.AX;
			}else if(rx2==Define.BX) {
				number=R.BX;
			}else if(rx2==Define.CX) {
				number=R.CX;
			}else if(rx2==Define.DX) {
				number=R.DX;
			}else if(rx2==Define.EX) {
				number=R.EX;
			}else if(rx2==Define.BP) {
				number=R.BP;
			}else if(rx2==Define.SS) {
				number=R.SS;
			}else if(rx2==Define.SP) {
				number=R.SP;
			}
			
			if(rx==Define.AX) {
				R.AX=number;
			}else if(rx==Define.BX) {
				R.BX=number;
			}else if(rx==Define.CX) {
				R.CX=number;
			}else if(rx==Define.DX) {
				R.DX=number;
			}else if(rx==Define.EX) {
				R.EX=number;
			}else if(rx==Define.BP) {
				R.BP=number;
			}else if(rx==Define.SS) {
				R.SS=number;
			}else if(rx==Define.SP) {
				R.SP=number;
			}
			//程序计数器下移
			R.PC+=isRun(opt);
		}
	}

}
